package cn.wolfcode.exception;

import cn.wolfcode.qo.JsonResult;
import com.alibaba.fastjson.JSON;
import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//控制器加强
@ControllerAdvice
public class ControllerAdviceForException {
    /**
     * 这个注解 代表是用来处理异常的
     * 注解上可以定义该方法是用来处理那种异常的  一般不要直接用 Exception , 因为如果是编译时异常的话 那就捕获不到了
     */
    @ExceptionHandler(RuntimeException.class)
    public Object handleException(Model model,RuntimeException e, HttpServletResponse response, HandlerMethod method) {
        e.printStackTrace();//输出异常信息 , 为了找 bug 方便
        /**
         * 如果用户本来访问的是 视图就返回视图 , json就返回json
         * 判断下 返回视图 就是  json json 有贴注解ResponseBody 所以我们根据注解来判断
         */
        if(method.hasMethodAnnotation(ResponseBody.class)){
            //利用响应对象
                response.setContentType("application/json;charset=utf-8");
            JsonResult json = new JsonResult(false, "请联系管理员!");
            try {
                response.getWriter().print(JSON.toJSONString(json));
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            return null;
        }else{
            model.addAttribute("ex",e);
            return "common/error";
        }

        //System.out.println("我捕获到了异常");
        /**
         * 可以加  model 再返回 出异常信息 因为我们  ftl 中 有回显的${(ex.message)!}
         */
    }

    @ExceptionHandler(UnauthorizedException.class)
    public Object handleUnauthorizedException(RuntimeException e, HttpServletResponse response, HandlerMethod method) {
        /**
         * 如果用户本来访问的是 视图就返回视图 , json就返回json
         * 判断下 返回视图 就是  json json 有贴注解ResponseBody 所以我们根据注解来判断
         */
        if(method.hasMethodAnnotation(ResponseBody.class)){
            //利用响应对象
            response.setContentType("application/json;charset=utf-8");
            JsonResult json = new JsonResult(false, "您没有访问权限!");
            try {
                response.getWriter().print(JSON.toJSONString(json));
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            return null;
        }else{
            return "common/nopermission";
        }
        //System.out.println("我捕获到了异常");
        /**
         * 可以加  model 再返回 出异常信息 因为我们  ftl 中 有回显的${(ex.message)!}
         */
    }




    /**
     * 我的测试哈哈
     */

//    @ExceptionHandler(RuntimeException.class)
//    @ResponseBody   //注意 Json  要贴注解
//    public JsonResult handleException2(RuntimeException e){
//        /// e.printStackTrace();//输出异常信息 , 为了找 bug 方便
//        System.out.println("我捕获到了异常");
//        return new JsonResult(false,"请联系管理员!");
//    }

//    @ExceptionHandler(RuntimeException.class)
//    public Object handleException3(RuntimeException e, HttpServletResponse response, HandlerMethod method) {
//        e.printStackTrace();//输出异常信息 , 为了找 bug 方便
//        /**
//         * 如果用户本来访问的是 视图就返回视图 , json就返回json
//         * 判断下 返回视图 就是  json json 有贴注解ResponseBody 所以我们根据注解来判断
//         */
//        if(method.hasMethodAnnotation(ResponseBody.class)){
//            //利用响应对象
//            response.setContentType("application/json;charset=utf-8");
//            JsonResult json = new JsonResult(false, "请联系管理员!");
//            try {
//                response.getWriter().print(JSON.toJSONString(json));
//            } catch (IOException e1) {
//                e1.printStackTrace();
//            }
//            return null;
//        }else{
//            return "common/error";
//        }
//        //System.out.println("我捕获到了异常");
//    }


}
